home *** CD-ROM | disk | FTP | other *** search
/ Computer Shopper 125 / Computer Shopper CD-ROM Issue 125 (1998-07)(Dennis Publishing).iso / Business / Dazzler / DAZZLER.Z / CRtfAction.class (.txt) < prev    next >
Encoding:
Java Class File  |  1997-11-26  |  6.8 KB  |  328 lines

  1. import java.awt.Color;
  2. import java.awt.Event;
  3. import java.awt.FontMetrics;
  4. import java.awt.Graphics;
  5. import java.awt.Point;
  6. import java.awt.Rectangle;
  7. import java.awt.Toolkit;
  8. import java.io.DataInputStream;
  9.  
  10. public class CRtfAction extends CDisplayAction {
  11.    static final int LOAD_FROM_FILE = 128;
  12.    protected String m_strText;
  13.    protected String m_strFileName;
  14.    protected Color m_rgbBackground = new Color(0, 0, 0);
  15.    protected Color m_rgbShadow = new Color(0, 0, 0);
  16.    protected byte m_cShadowOffsetX;
  17.    protected byte m_cShadowOffsetY;
  18.    protected int m_nFlags;
  19.    private String m_strPaintText = "";
  20.    private RichCharArray m_RichCharArray = new RichCharArray();
  21.    private HTRegionArray m_htrArray = new HTRegionArray();
  22.    private CRectArray m_rcArray = new CRectArray();
  23.    private String m_strHyperText = "";
  24.    private int m_nBulletIndent = 0;
  25.    private boolean m_bIndented = false;
  26.  
  27.    boolean DoAction() {
  28.       boolean var1 = false;
  29.       if ((this.m_nFlags & 128) == 0) {
  30.          if (this.m_strText.equals("")) {
  31.             System.out.println("Error: Rich text string missing");
  32.          } else {
  33.             String var2 = Utils.InsertVariablesInString(this.m_strText, true);
  34.             if (!this.m_strPaintText.equals(var2)) {
  35.                this.m_strPaintText = var2;
  36.                var1 = true;
  37.             }
  38.          }
  39.       } else if (this.m_strFileName.equals("")) {
  40.          System.out.println("Error: Rich text filename missing");
  41.       } else {
  42.          System.out.println("Rich text action does not presently support load from file");
  43.       }
  44.  
  45.       CRtfParser var4 = new CRtfParser(this.m_strPaintText);
  46.       this.m_RichCharArray = var4.ParseRtfFile(this.m_strPaintText);
  47.       CRect var3 = new CRect(((CDisplayAction)this).GetActualRect());
  48.       var3.x += 8;
  49.       var3.width -= 8;
  50.       if (!((Rectangle)var3).equals(((CDisplayAction)this).GetDrawRect())) {
  51.          if (!((CDisplayAction)this).GetDrawRect().isEmpty()) {
  52.             Globals.thePresView.InvalidateOffScreenRect(((CDisplayAction)this).GetDrawRect());
  53.          }
  54.  
  55.          ((CDisplayAction)this).SetDrawRect(var3);
  56.          var1 = true;
  57.       }
  58.  
  59.       if (super.m_Effect.HasValidEffect()) {
  60.          Globals.thePresView.RenderAndDrawDirtyList();
  61.          Globals.thePresView.AddDrawObject((CIconObject)this, 2048, var1);
  62.       } else {
  63.          Globals.thePresView.AddDrawObject((CIconObject)this, 0, var1);
  64.       }
  65.  
  66.       return true;
  67.    }
  68.  
  69.    void DrawObject(Graphics var1, int var2, CRect var3) {
  70.       new CRect();
  71.       int var5 = 0;
  72.       int var6 = 0;
  73.       int var7 = var3.y;
  74.       Graphics var8 = var1.create();
  75.       var8.clipRect(var3.x, var3.y, var3.width, var3.height);
  76.       this.m_htrArray.RemoveAll();
  77.       this.m_rcArray.RemoveAll();
  78.       this.m_strHyperText = "";
  79.       if ((this.m_nFlags & 16) != 0) {
  80.          var8.setColor(this.m_rgbBackground);
  81.          var8.fillRect(var3.x, var3.y, var3.width, var3.height);
  82.       }
  83.  
  84.       while(var6 < this.m_RichCharArray.GetSize() && (var7 < var3.y + var3.height || !this.m_strHyperText.equals(""))) {
  85.          int var9 = this.m_bIndented ? this.m_nBulletIndent : 0;
  86.          if (var5 != 0) {
  87.             var5 = this.FindNextLineStartIndex(var6);
  88.          }
  89.  
  90.          if ((this.m_nFlags & 8) != 0) {
  91.             var6 = this.FindNextLineEndIndex(var5, var3.width - Math.abs(this.m_cShadowOffsetX) - var9);
  92.          } else {
  93.             var6 = this.FindNextLineEndIndex(var5, var3.width - var9);
  94.          }
  95.  
  96.          CRect var4 = this.GetLineDimensions(var7, var5, var6);
  97.          if ((this.m_RichCharArray.GetAt(var5).Flags & 1) != 0) {
  98.             var4.x = var3.x + (var3.width - var4.width);
  99.             if ((this.m_nFlags & 8) != 0 && this.m_cShadowOffsetX > 0) {
  100.                var4.x -= this.m_cShadowOffsetX;
  101.             }
  102.          } else if ((this.m_RichCharArray.GetAt(var5).Flags & 2) != 0) {
  103.             var4.x = var3.x + (var3.width - var4.width) / 2;
  104.             if ((this.m_nFlags & 8) != 0) {
  105.                var4.x -= this.m_cShadowOffsetX / 2;
  106.             }
  107.          } else {
  108.             var4.x = var3.x + var9;
  109.             if ((this.m_nFlags & 8) != 0 && this.m_cShadowOffsetX < 0) {
  110.                var4.x -= this.m_cShadowOffsetX;
  111.             }
  112.          }
  113.  
  114.          if ((this.m_nFlags & 8) != 0 && this.m_cShadowOffsetY < 0) {
  115.             var4.y -= this.m_cShadowOffsetY;
  116.          }
  117.  
  118.          if ((this.m_nFlags & 8) != 0) {
  119.             ((Rectangle)var4).move(var4.x + this.m_cShadowOffsetX, var4.y + this.m_cShadowOffsetY);
  120.             this.DrawLine(var8, var4, var5, var6, true);
  121.             ((Rectangle)var4).move(var4.x - this.m_cShadowOffsetX, var4.y - this.m_cShadowOffsetY);
  122.          }
  123.  
  124.          this.DrawLine(var8, var4, var5, var6, false);
  125.          var7 += var4.height;
  126.          var5 = var6;
  127.       }
  128.  
  129.    }
  130.  
  131.    boolean LoadFromFile(DataInputStream var1) {
  132.       this.m_nFlags = FileLoad.ReadCPlusInt(var1);
  133.       FileLoad.ReadColor(var1);
  134.       this.m_rgbBackground = FileLoad.ReadColor(var1);
  135.       this.m_strText = FileLoad.ReadCString(var1);
  136.       this.m_cShadowOffsetX = (byte)FileLoad.ReadCPlusByte(var1);
  137.       this.m_cShadowOffsetY = (byte)FileLoad.ReadCPlusByte(var1);
  138.       this.m_rgbShadow = FileLoad.ReadColor(var1);
  139.       FileLoad.ReadCPlusByte(var1);
  140.       this.m_strFileName = FileLoad.ReadCString(var1);
  141.       CFontObject var2 = new CFontObject();
  142.       var2.LoadFromFile(var1);
  143.       return super.LoadFromFile(var1);
  144.    }
  145.  
  146.    CRect GetLineDimensions(int var1, int var2, int var3) {
  147.       FontMetrics var5 = Toolkit.getDefaultToolkit().getFontMetrics(this.m_RichCharArray.GetAt(var2).Font);
  148.       CRect var6 = new CRect(0, var1 + var5.getAscent(), 0, var5.getHeight());
  149.  
  150.       for(int var7 = var2; var7 < var3; ++var7) {
  151.          RichChar var4 = this.m_RichCharArray.GetAt(var7);
  152.          if (!var4.Font.equals(var5.getFont())) {
  153.             var5 = Toolkit.getDefaultToolkit().getFontMetrics(var4.Font);
  154.             var6.y = Math.max(var6.y, var1 + var5.getAscent());
  155.             var6.height = Math.max(var6.height, var5.getHeight());
  156.          }
  157.  
  158.          var6.width += var4.Width;
  159.       }
  160.  
  161.       return var6;
  162.    }
  163.  
  164.    void DrawLine(Graphics var1, CRect var2, int var3, int var4, boolean var5) {
  165.       int var7 = var2.x;
  166.       if (var5) {
  167.          var1.setColor(this.m_rgbShadow);
  168.       }
  169.  
  170.       for(int var8 = var3; var8 < var4; ++var8) {
  171.          RichChar var6 = this.m_RichCharArray.GetAt(var8);
  172.          if (var6.Char != '\n') {
  173.             if (var6.Char != '\t') {
  174.                if (!var1.getFont().equals(var6.Font)) {
  175.                   var1.setFont(var6.Font);
  176.                }
  177.  
  178.                if (!var5 && !var1.getColor().equals(var6.Colour)) {
  179.                   var1.setColor(var6.Colour);
  180.                }
  181.  
  182.                var1.drawString(String.valueOf(var6.Char), var7, var2.y);
  183.                if ((var6.Flags & 8) != 0) {
  184.                   int var9 = Math.max(1, var6.Font.getSize() / 20);
  185.                   if (var6.Font.isBold()) {
  186.                      var9 *= 2;
  187.                   }
  188.  
  189.                   var1.fillRect(var7, var2.y + var1.getFontMetrics().getDescent() / 2, var6.Width, var9);
  190.                }
  191.  
  192.                if ((var6.Flags & 16) != 0) {
  193.                   int var10 = Math.max(1, var6.Font.getSize() / 20);
  194.                   if (var6.Font.isBold()) {
  195.                      ++var10;
  196.                   }
  197.  
  198.                   var1.fillRect(var7, var2.y - (var1.getFontMetrics().getAscent() / 3 + var10 / 2), var6.Width, var10);
  199.                }
  200.             }
  201.  
  202.             var7 += var6.Width;
  203.          }
  204.  
  205.          if (!var5) {
  206.             if ((var6.Flags & 4) != 0) {
  207.                if (var6.Char == '\n') {
  208.                   String var11 = this.m_strHyperText;
  209.                   this.m_strHyperText = var11 + "\r\n";
  210.                } else {
  211.                   String var10001 = this.m_strHyperText;
  212.                   this.m_strHyperText = var10001 + var6.Char;
  213.                   if (this.m_rcArray.GetSize() == 0) {
  214.                      this.m_rcArray.Add(new CRect(var7 - var6.Width, var2.y - var1.getFontMetrics().getAscent(), var6.Width, var2.height));
  215.                   } else if (this.m_rcArray.GetAt(this.m_rcArray.GetUpperBound()).getRight() == var7 && this.m_rcArray.GetAt(this.m_rcArray.GetUpperBound()).y == var2.y - var1.getFontMetrics().getAscent()) {
  216.                      CRect var10000 = this.m_rcArray.GetAt(this.m_rcArray.GetUpperBound());
  217.                      var10000.width += var6.Width;
  218.                   } else {
  219.                      this.m_rcArray.Add(new CRect(var7 - var6.Width, var2.y - var1.getFontMetrics().getAscent(), var6.Width, var2.height));
  220.                   }
  221.                }
  222.             } else if (!this.m_strHyperText.equals("")) {
  223.                this.AddHypertextRegion();
  224.             }
  225.  
  226.             if (var8 == this.m_RichCharArray.GetUpperBound() && !this.m_strHyperText.equals("")) {
  227.                this.AddHypertextRegion();
  228.             }
  229.          }
  230.       }
  231.  
  232.    }
  233.  
  234.    void AddHypertextRegion() {
  235.       this.m_strHyperText = this.m_strHyperText.trim();
  236.       this.m_htrArray.Add(new HyperTextRegion(this.m_strHyperText, this.m_rcArray));
  237.       this.m_strHyperText = "";
  238.       this.m_rcArray.RemoveAll();
  239.    }
  240.  
  241.    int FindNextLineEndIndex(int var1, int var2) {
  242.       int var5 = 0;
  243.       int var3 = var1;
  244.  
  245.       int var4;
  246.       for(var4 = var1; var5 <= var2 && var3 < this.m_RichCharArray.GetSize(); ++var3) {
  247.          switch (this.m_RichCharArray.GetAt(var3).Char) {
  248.             case '\t':
  249.                if (this.m_nBulletIndent == 0) {
  250.                   this.m_nBulletIndent = Math.max(1, this.m_RichCharArray.GetAt(var3).Width);
  251.                }
  252.  
  253.                int var6;
  254.                for(var6 = this.m_nBulletIndent; var6 <= var5; var6 += this.m_nBulletIndent) {
  255.                }
  256.  
  257.                this.m_RichCharArray.GetAt(var3).Width = var6 - var5;
  258.                var5 = var6;
  259.                if (var6 > var2 && var4 == var1) {
  260.                   var4 = Math.max(var3, var1 + 1);
  261.                }
  262.                break;
  263.             case '\n':
  264.                var4 = var3 + 1;
  265.                var5 = var2 + 1;
  266.                this.m_bIndented = false;
  267.                break;
  268.             case ' ':
  269.                var5 += this.m_RichCharArray.GetAt(var3).Width;
  270.                if (var3 > 0 && this.m_RichCharArray.GetAt(var3 - 1).Char != ' ') {
  271.                   var4 = var3;
  272.                }
  273.                break;
  274.             case '┬╖':
  275.                this.m_bIndented = true;
  276.             default:
  277.                var5 += this.m_RichCharArray.GetAt(var3).Width;
  278.                if (var5 > var2 && var4 == var1) {
  279.                   var4 = Math.max(var3, var1 + 1);
  280.                }
  281.          }
  282.       }
  283.  
  284.       if (var3 == this.m_RichCharArray.GetSize() && var4 == var1) {
  285.          var4 = Math.max(var3, var1 + 1);
  286.       }
  287.  
  288.       return var4;
  289.    }
  290.  
  291.    int FindNextLineStartIndex(int var1) {
  292.       RichChar var2;
  293.       if (this.m_RichCharArray.GetAt(var1 - 1).Char != '\n') {
  294.          for(; (var2 = this.m_RichCharArray.GetAt(var1)).Char == ' ' && var1 < this.m_RichCharArray.GetSize(); ++var1) {
  295.             if ((var2.Flags & 4) != 0) {
  296.                String var10001 = this.m_strHyperText;
  297.                this.m_strHyperText = var10001 + var2.Char;
  298.             } else if (!this.m_strHyperText.equals("")) {
  299.                this.AddHypertextRegion();
  300.             }
  301.          }
  302.       }
  303.  
  304.       return var1;
  305.    }
  306.  
  307.    boolean OnMouseClick(int var1, int var2, Point var3, int var4, CRect var5) {
  308.       if (var4 == 6 && var1 == 2022) {
  309.          for(int var6 = 0; var6 < this.m_htrArray.GetSize(); ++var6) {
  310.             for(int var7 = 0; var7 < this.m_htrArray.GetAt(var6).m_rcArray.GetSize(); ++var7) {
  311.                if (this.m_htrArray.GetAt(var6).m_rcArray.GetAt(var7).inside(var3.x, var3.y)) {
  312.                   Event var8 = new Event(Globals.thePresView, 2029, this.m_htrArray.GetAt(var6).m_strHyperText);
  313.                   var8.modifiers = 32898;
  314.                   Globals.thePresView.postEvent(var8);
  315.                }
  316.             }
  317.          }
  318.       }
  319.  
  320.       return false;
  321.    }
  322.  
  323.    public CRtfAction() {
  324.       super(55);
  325.       ((CDisplayAction)this).SetZOrder((short)4);
  326.    }
  327. }
  328.